<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS3 盒模型</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            line-height: 1.6;
            margin: 0;
            padding: 20px;
            color: #333;
        }
        h1 {
            color: #0066cc;
            border-bottom: 2px solid #0066cc;
            padding-bottom: 10px;
        }
        h2 {
            color: #0099cc;
            margin-top: 30px;
        }
        h3 {
            color: #00aadd;
        }
        .example {
            background-color: #f5f5f5;
            border-left: 4px solid #0066cc;
            padding: 15px;
            margin: 20px 0;
            border-radius: 0 4px 4px 0;
        }
        .code {
            background-color: #f8f8f8;
            border: 1px solid #ddd;
            border-radius: 4px;
            padding: 15px;
            margin: 15px 0;
            overflow-x: auto;
            font-family: Consolas, Monaco, 'Andale Mono', monospace;
        }
        .note {
            background-color: #ffffd9;
            border-left: 4px solid #ffcc00;
            padding: 15px;
            margin: 20px 0;
            border-radius: 0 4px 4px 0;
        }
        .preview {
            border: 1px solid #ddd;
            padding: 20px;
            margin: 15px 0;
            border-radius: 4px;
            background-color: #fff;
        }
        table {
            border-collapse: collapse;
            width: 100%;
            margin: 20px 0;
        }
        th, td {
            border: 1px solid #ddd;
            padding: 8px 12px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
        nav {
            background-color: #f8f8f8;
            padding: 10px;
            margin-bottom: 20px;
            border-radius: 4px;
        }
        nav a {
            margin-right: 15px;
            text-decoration: none;
            color: #0066cc;
        }
        nav a:hover {
            text-decoration: underline;
        }
        /* 演示用样式 */
        .box-demo {
            margin: 20px 0;
            display: flex;
            flex-wrap: wrap;
            gap: 20px;
        }
        .box {
            width: 100px;
            height: 100px;
            background-color: #e0f0ff;
            border: 5px solid #0066cc;
            padding: 20px;
            margin: 10px;
            text-align: center;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 14px;
        }
        .box-content {
            background-color: #cce6ff;
            padding: 5px;
        }
        .box-sizing-content {
            box-sizing: content-box;
            background-color: #e0f0ff;
        }
        .box-sizing-border {
            box-sizing: border-box;
            background-color: #f0e6ff;
        }
        .box-shadow {
            box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);
        }
        .border-radius {
            border-radius: 15px;
        }
        .border-image {
            border-image: linear-gradient(to right, #0066cc, #00ccff) 1;
        }
    </style>
</head>
<body>
    <nav>
        <a href="index.html">首页</a>
        <a href="css3-selectors.html">CSS选择器</a>
        <a href="css3-box-model.html">盒模型</a>
        <a href="css3-layout-flexbox.html">Flexbox布局</a>
        <a href="css3-layout-grid.html">Grid布局</a>
        <a href="css3-colors-gradients.html">颜色与渐变</a>
        <a href="css3-transforms.html">变换</a>
        <a href="css3-transitions-animations.html">过渡与动画</a>
        <a href="css3-responsive.html">响应式设计</a>
    </nav>

    <h1>CSS3 盒模型</h1>
    
    <section>
        <h2>盒模型基础概念</h2>
        <div class="example">
            <p>在 CSS 中，所有元素都被视为一个矩形盒子。这个盒子由四个部分组成（从内到外）：</p>
            <ul>
                <li><strong>内容区域（Content）</strong>：显示元素的实际内容（文本、图像等）</li>
                <li><strong>内边距（Padding）</strong>：内容与边框之间的空间</li>
                <li><strong>边框（Border）</strong>：围绕内容和内边距的线条</li>
                <li><strong>外边距（Margin）</strong>：盒子与其他元素之间的空间</li>
            </ul>
            
            <div class="box-demo">
                <div>
                    <div class="box">
                        <div class="box-content">内容</div>
                    </div>
                    <p style="text-align: center;">盒模型示例</p>
                </div>
            </div>
            
            <div class="code">
                .box {
                    width: 100px;        /* 内容区域宽度 */
                    height: 100px;       /* 内容区域高度 */
                    padding: 20px;       /* 内边距 */
                    border: 5px solid #0066cc;  /* 边框 */
                    margin: 10px;        /* 外边距 */
                }
            </div>
        </div>
        
        <div class="note">
            <p><strong>重要概念：</strong> 在标准盒模型中，<code>width</code> 和 <code>height</code> 属性仅设置内容区域的尺寸，不包括内边距和边框。这意味着元素的实际占用空间 = 内容宽度/高度 + 内边距 + 边框 + 外边距。</p>
        </div>
    </section>
    
    <section>
        <h2>盒模型属性详解</h2>
        <div class="example">
            <h3>宽度和高度</h3>
            <div class="code">
                /* 基本尺寸属性 */
                width: 300px;       /* 设置内容区域宽度 */
                height: 200px;      /* 设置内容区域高度 */
                
                /* 最小/最大尺寸 */
                min-width: 100px;   /* 最小宽度 */
                max-width: 500px;   /* 最大宽度 */
                min-height: 50px;   /* 最小高度 */
                max-height: 300px;  /* 最大高度 */
            </div>
            <p>这些属性控制元素内容区域的尺寸。最小/最大尺寸属性在创建响应式设计时特别有用。</p>
            
            <h3>内边距（Padding）</h3>
            <div class="code">
                /* 所有边统一设置 */
                padding: 20px;
                
                /* 分别设置各边 (顺序: 上 右 下 左) */
                padding: 10px 20px 15px 25px;
                
                /* 上下相同，左右相同 */
                padding: 10px 20px;
                
                /* 上边单独，左右相同，下边单独 */
                padding: 10px 20px 30px;
                
                /* 单独设置各边 */
                padding-top: 10px;
                padding-right: 20px;
                padding-bottom: 15px;
                padding-left: 25px;
            </div>
            <p>内边距创建元素内容与其边框之间的空间。内边距区域通常会继承元素的背景颜色。</p>
            
            <h3>边框（Border）</h3>
            <div class="code">
                /* 简写属性 */
                border: 1px solid black;  /* 宽度 样式 颜色 */
                
                /* 分别设置各边 */
                border-top: 2px dashed red;
                border-right: 3px dotted green;
                border-bottom: 4px double blue;
                border-left: 5px groove orange;
                
                /* 单独设置边框属性 */
                border-width: 2px;         /* 宽度 */
                border-style: solid;       /* 样式 */
                border-color: #333;        /* 颜色 */
                
                /* 单独设置特定边的特定属性 */
                border-top-width: 3px;
                border-right-style: dashed;
                border-bottom-color: blue;
            </div>
            <p>边框围绕元素的内边距和内容。CSS 提供了多种边框样式，如 solid（实线）、dashed（虚线）、dotted（点线）等。</p>
            
            <h3>外边距（Margin）</h3>
            <div class="code">
                /* 所有边统一设置 */
                margin: 20px;
                
                /* 分别设置各边 (顺序: 上 右 下 左) */
                margin: 10px 20px 15px 25px;
                
                /* 上下相同，左右相同 */
                margin: 10px 20px;
                
                /* 上边单独，左右相同，下边单独 */
                margin: 10px 20px 30px;
                
                /* 单独设置各边 */
                margin-top: 10px;
                margin-right: 20px;
                margin-bottom: 15px;
                margin-left: 25px;
                
                /* 水平居中 */
                margin: 0 auto;
                
                /* 负外边距 */
                margin-top: -10px;
            </div>
            <p>外边距创建元素与其他元素之间的空间。外边距是透明的（不会显示背景颜色）。</p>
        </div>
        
        <div class="note">
            <p><strong>外边距折叠：</strong> 当两个垂直外边距相遇时，它们会形成一个外边距，其大小等于较大的那个外边距值。这种行为称为"外边距折叠"。只发生在垂直方向，水平外边距不会折叠。</p>
        </div>
    </section>
    
    <section>
        <h2>CSS3 盒模型新特性</h2>
        <div class="example">
            <h3>box-sizing 属性</h3>
            <div class="code">
                /* 标准盒模型 */
                box-sizing: content-box;  /* 默认值 */
                
                /* 替代（IE）盒模型 */
                box-sizing: border-box;
            </div>
            <p><code>box-sizing</code> 属性改变了宽度和高度的计算方式：</p>
            <ul>
                <li><strong>content-box</strong>：标准盒模型。width/height 只包括内容区域。</li>
                <li><strong>border-box</strong>：替代盒模型。width/height 包括内容、内边距和边框（但不包括外边距）。</li>
            </ul>
            
            <div class="box-demo">
                <div>
                    <div class="box box-sizing-content" style="width: 150px; height: 150px;">
                        content-box
                    </div>
                    <p>width: 150px<br>实际宽度 = 150px + padding + border</p>
                </div>
                <div>
                    <div class="box box-sizing-border" style="width: 150px; height: 150px;">
                        border-box
                    </div>
                    <p>width: 150px<br>实际宽度 = 150px（包含padding和border）</p>
                </div>
            </div>
            
            <h3>边框圆角（Border Radius）</h3>
            <div class="code">
                /* 所有角统一设置 */
                border-radius: 10px;
                
                /* 分别设置各角 (顺序: 左上 右上 右下 左下) */
                border-radius: 5px 10px 15px 20px;
                
                /* 单独设置各角 */
                border-top-left-radius: 5px;
                border-top-right-radius: 10px;
                border-bottom-right-radius: 15px;
                border-bottom-left-radius: 20px;
                
                /* 创建椭圆角 (水平半径/垂直半径) */
                border-radius: 20px / 10px;
            </div>
            
            <div class="box-demo">
                <div class="box border-radius">圆角盒子</div>
            </div>
            
            <h3>盒阴影（Box Shadow）</h3>
            <div class="code">
                /* 基本语法: x偏移 y偏移 模糊半径 扩散半径 颜色 */
                box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.3);
                
                /* 内阴影 */
                box-shadow: inset 2px 2px 5px rgba(0, 0, 0, 0.2);
                
                /* 多重阴影 */
                box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.2),
                           inset 1px 1px 2px rgba(0, 0, 0, 0.1);
            </div>
            
            <div class="box-demo">
                <div class="box box-shadow">阴影盒子</div>
            </div>
            
            <h3>边框图像（Border Image）</h3>
            <div class="code">
                /* 基本语法 */
                border-image: source slice width outset repeat;
                
                /* 示例 */
                border-image: url('border-image.png') 30 30 stretch;
                
                /* 使用渐变作为边框 */
                border-image: linear-gradient(to right, red, blue) 1;
            </div>
            
            <div class="box-demo">
                <div class="box border-image">渐变边框</div>
            </div>
        </div>
        
        <div class="note">
            <p><strong>最佳实践：</strong> 许多开发者在全局样式中设置 <code>box-sizing: border-box;</code>，使所有元素使用更直观的替代盒模型：</p>
            <div class="code">
                *, *::before, *::after {
                    box-sizing: border-box;
                }
            </div>
        </div>
    </section>
    
    <section>
        <h2>盒模型与布局</h2>
        <div class="example">
            <h3>溢出处理（Overflow）</h3>
            <div class="code">
                /* 溢出内容被裁剪，不可见 */
                overflow: hidden;
                
                /* 添加滚动条，无论是否需要 */
                overflow: scroll;
                
                /* 仅在需要时添加滚动条（默认值） */
                overflow: auto;
                
                /* 溢出内容可见（可能会溢出到其他元素上） */
                overflow: visible;
                
                /* 分别控制水平和垂直溢出 */
                overflow-x: hidden;
                overflow-y: auto;
            </div>
            <p>overflow 属性控制内容超出元素盒子时的行为。</p>
            
            <h3>调整尺寸（Resize）</h3>
            <div class="code">
                /* 允许用户调整元素的宽度和高度 */
                resize: both;
                
                /* 只允许调整宽度 */
                resize: horizontal;
                
                /* 只允许调整高度 */
                resize: vertical;
                
                /* 禁止调整（默认值） */
                resize: none;
            </div>
            <p>resize 属性允许用户调整元素的大小。通常与 overflow 属性一起使用。</p>
            
            <h3>轮廓（Outline）</h3>
            <div class="code">
                /* 简写属性 */
                outline: 2px solid blue;
                
                /* 单独设置属性 */
                outline-width: 2px;
                outline-style: dashed;
                outline-color: red;
                
                /* 轮廓偏移 */
                outline-offset: 5px;
            </div>
            <p>轮廓类似于边框，但不占用空间，不影响元素尺寸或位置。常用于焦点状态。</p>
        </div>
    </section>
    
    <section>
        <h2>盒模型的实际应用</h2>
        <div class="example">
            <h3>创建卡片组件</h3>
            <div class="code">
                .card {
                    width: 300px;
                    padding: 20px;
                    margin: 15px;
                    border: 1px solid #ddd;
                    border-radius: 8px;
                    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
                }
                
                .card:hover {
                    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
                }
            </div>
            
            <h3>创建按钮</h3>
            <div class="code">
                .button {
                    display: inline-block;
                    padding: 10px 20px;
                    margin: 5px;
                    border: none;
                    border-radius: 4px;
                    background-color: #0066cc;
                    color: white;
                    cursor: pointer;
                }
                
                .button:hover {
                    background-color: #0055aa;
                }
            </div>
            
            <h3>创建分隔线</h3>
            <div class="code">
                .divider {
                    height: 1px;
                    margin: 20px 0;
                    background-color: #ddd;
                    border: none;
                }
            </div>
        </div>
    </section>
    
    <section>
        <h2>盒模型调试技巧</h2>
        <ul>
            <li>使用浏览器开发者工具查看和修改盒模型</li>
            <li>添加临时边框以可视化元素边界：<code>* { border: 1px solid red; }</code></li>
            <li>使用 <code>box-sizing: border-box;</code> 简化尺寸计算</li>
            <li>记住外边距折叠规则，特别是在垂直布局中</li>
            <li>使用 CSS 重置或标准化样式表消除浏览器默认样式差异</li>
        </ul>
    </section>
    
    <footer>
        <p>&copy; 2023 CSS3 学习指南。保留所有权利。</p>
    </footer>
</body>
</html>